package com.ad.platform.common.utils;

import com.ad.payload.util.StringUtil;
import com.ad.platform.common.constant.Const;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.*;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @author:dxgong
 * @日期 2020/2/6 16:30
 * @注释 spring boot 发送rest请求工具类
 */
@Slf4j
public class RestTemplateUtil {

    /**
     * 向目的URL发送post请求
     *
     * @param url        目的url
     * @param params     发送的参数
     * @param methodType 0get   1post
     * @return ResultVO
     */
    public static String sendPostRequest(String url, MultiValueMap<String, String> params, Integer methodType) {
        RestTemplate client = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        HttpMethod method = null;
        if (Const.GET_CODE == methodType) {
            method = HttpMethod.GET;
        } else {
            method = HttpMethod.POST;
        }
        // 以表单的方式提交
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        //将请求头部和参数合成一个请求
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
        //执行HTTP请求，将返回的结构使用ResultVO类格式化
        ResponseEntity<String> response = client.exchange(url, method, requestEntity, String.class);
        log.info("============");
        log.info(response.getBody());
        log.info("============");
        return response.getBody();
    }


    /**
     * 向目的URL发送post请求
     *
     * @param url        目的url
     * @return ResultVO
     */
    public static String sendRequestForJson(String url, String json) {
        RestTemplate client = new RestTemplate();
        //执行HTTP请求，将返回的结构使用ResultVO类格式化
        String forObject = client.getForObject(url, String.class, json);
        log.info("============");
        log.info(forObject);
        log.info("============");
        return forObject;
    }



    /**
     * 方法名: getRemotePortData
     * 描述: 发送远程请求 获得代码示例
     * 参数：  @param urls 访问路径
     * 参数：  @param param 访问参数-字符串拼接格式, 例：port_d=10002&port_g=10007&country_a=
     * 创建人:
     * 创建时间: 2017年3月6日 下午3:20:32
     * 版本号: v1.0
     * 返回类型: String
     */
    public static String getRemotePortData(String urls, String param){
        try {
            URL url = new URL(urls);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 设置连接超时时间
            conn.setConnectTimeout(30000);
            // 设置读取超时时间
            conn.setReadTimeout(30000);
            conn.setRequestMethod("POST");
            if(StringUtil.isNotBlank(param)) {
                conn.setRequestProperty("Origin", "https://sirius.searates.com");// 主要参数
                conn.setRequestProperty("Referer", "https://sirius.searates.com/cn/port?A=ChIJP1j2OhRahjURNsllbOuKc3Y&D=567&G=16959&shipment=1&container=20st&weight=1&product=0&request=&weightcargo=1&");
                conn.setRequestProperty("X-Requested-With", "XMLHttpRequest");// 主要参数
            }
            // 需要输出
            conn.setDoInput(true);
            // 需要输入
            conn.setDoOutput(true);
            // 设置是否使用缓存
            conn.setUseCaches(false);
            // 设置请求属性
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接
            conn.setRequestProperty("Charset", "UTF-8");

            if(StringUtil.isNotBlank(param)) {
                // 建立输入流，向指向的URL传入参数
                DataOutputStream dos=new DataOutputStream(conn.getOutputStream());
                dos.writeBytes(param);
                dos.flush();
                dos.close();
            }
            // 输出返回结果
            InputStream input = conn.getInputStream();
            int resLen =0;
            byte[] res = new byte[1024];
            StringBuilder sb=new StringBuilder();
            while((resLen=input.read(res))!=-1){
                sb.append(new String(res, 0, resLen));
            }
            return sb.toString();
        } catch (MalformedURLException e) {
            e.printStackTrace();
            log.info("1数据发生异常：" + e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
            log.info("2数据发生异常：" + e.getMessage());
        }
        log.info("数据失败, 返回空字符串");
        return "";
    }

}
